1. /* sdfcoshs.cpp by K.Tsuru */
  2. // function ID 3307 DRADIX
  3. #ifndef SN_H
  4. #include "sn.h"
  5. #endif
  6. /**************************************************************
  7. SDouble class
  8. hyperbolic function cosh x by series for |x| < DRADIX
  9. If first != 0 calculate cosh(x), else cosh(x) - 1 for small x.
  10. Default argument is declared as first = 1.
  11. When x is larger than about 20.0, it is slow and error is large.
  12. ***************************************************************/
  13. static const char* func = "CoshSeries";
  14. SDouble CoshSeries(const SDouble& x){
  15. return CoshSeries(x, 1);
  16. }
  17. SDouble CoshSeries(const SDouble& x, int first){
  18. if(x.NetRdxExp() > 1) x.SetError(x.OUT_OF_RANGE, func, 3307);
  19. SDouble sum, xsq = x*x, delta, t;
  20. if(first){
  21. sum = 1.0; sum.FixedPoint(sum.RdxExp());
  22. }else{
  23. sum.SetZero(); sum.FixedPoint(xsq.RdxExp());
  24. }
  25. delta = DsDiv(xsq, 2uL); // delta = x*x/2
  26. ulong n = 3uL, den, mt = sum.SlOpMaxValue();
  27. sum = DDAdd(sum, delta); // sum += delta;
  28. while( delta.Sign(3307) ){
  29. den = n*(n+1uL);
  30. if(den >= mt) break;
  31. t = delta*xsq;
  32. delta = DsDiv(t, den);
  33. sum = DDAdd(sum, delta);
  34. n += 2uL;
  35. }
  36. while( delta.Sign(3307) ){
  37. if(n >= mt){
  38. sum.SetError(sum.NOT_CONVERGE, func, -3307);
  39. break;
  40. }
  41. t = delta*xsq;
  42. delta = DsDiv(t, n); delta = DsDiv(delta, n+1uL);
  43. sum = DDAdd(sum, delta);
  44. n += 2uL;
  45. }
  46. sum.PointFree();
  47. sum.Reform(3307);
  48. sum.upToTerm = (n+1)/2;
  49. return sum;
  50. }

sdfcoshs.cpp : last modifiled at 2015/12/03 21:35:59(1,469 bytes)
created at 2017/10/07 10:22:50
The creation time of this html file is 2017/10/07 11:29:39 (Sat Oct 07 11:29:39 2017).